import { dayjs, ElMessage, ElNotification } from 'element-plus';
import message from './message';
import { useThemeConfig } from '../stores/themeConfig';
import color from 'color';

export const msg = message;

// YYYY-MM-DD HH:mm:ss
export function timeFormat(time, format = 'YYYY-MM-DD HH:mm') {
	// 先对入参time进行校验
	var date = new Date();
	if (time === undefined || time === null) {
		return '';
	} else if (typeof time === 'string') {
		date = new Date(time);
		if (isNaN(date.getTime())) {
			return time;
		}
	} else {
		date = time as Date;
	}
	return dayjs(date).format(format);
}

/**
 * 判断是否为空
 * 判断对象，数组，字符串是否为空，例如:  undefined , null , '' , '   ' , {}  , [] 全部判断为空
 */
export function isNull(value: any) {
	if (value === undefined || value === null) {
		return true;
	}
	if (typeof value === 'string' && value.trim() === '') {
		return true;
	}
	if (typeof value === 'number' && Number.isNaN(value)) {
		return true;
	}
	if (Array.isArray(value) && value.length === 0) {
		return true;
	}
	if (value.constructor === Object && Reflect.ownKeys(value).length === 0) {
		return true;
	}
	return false;
}

// 控制台日志, 支持传一个参数(对象/字符串), 也支持传两个参数(标志,日志消息<可以是对象,可以是字符串>)
export function clog(flag: any, value: any = 'xxxxxxxxxxxxxxxxxxx=Default-value_override+xxxxxxxxxxxxxxxxx'): string {
	let prefix = '[' + new Date().getMinutes() + ':' + new Date().getSeconds() + ' clog] ';
	try {
		let tmp = '';
		if (value === `xxxxxxxxxxxxxxxxxxx=Default-value_override+xxxxxxxxxxxxxxxxx`) {
			// 如果value为默认值或空,则没有传递第二个参数,只处理第一个参数
			if (typeof flag === 'string') {
				tmp = flag;
			} else {
				tmp = JSON.stringify(flag);
			}
			console.log(prefix + tmp);
		} else if (isNull(flag)) {
			// 如果flag为空,则没有传递第一个参数,只处理第二个参数
			tmp = JSON.stringify(value);
			console.log(prefix + tmp);
		} else {
			if (value === undefined) {
				tmp = 'undefined';
			} else if (value === null) {
				tmp = 'null';
			} else if (isNull(value)) {
				tmp = '空对象或者空字符串 ';
			} else {
				tmp = JSON.stringify(value);
			}
			console.log(prefix + flag + ':' + tmp);
		}
		return tmp;
	} catch (err) {
		console.log(prefix, err);
		return ' 空对象或者空字符串 ';
	}
}

export function showSuccess(msg: string = '操作成功') {
	ElNotification({
		type: 'success',
		message: msg,
	});
}

export function showWarning(msg: string) {
	ElMessage({
		showClose: true,
		type: 'warning',
		message: msg,
	});
}

export function showError(msg: string) {
	console.error(msg);
	var message = `<div style="text-align:center; padding:10px; "><h3> 错误 </h3> </div><div style="text-align:center; color: #000"><h2> ${msg} </h2> </div>`
	ElMessage({
		dangerouslyUseHTMLString: true,
		message: message,
		type: 'error',
		showClose: true,
		duration: 6000,
		grouping: true,
	});
}

/* 分页器设置每页数量缓存
 */
export function setPageSize(num: number) {
	localStorage.setItem('PageSize', num.toString());
}

/**
 * 读取缓存的每页数量
 * @returns 返回缓存设置的页数，没缓存时默认10
 */
export function getPageSize() {
	return Number(localStorage.getItem('PageSize') ?? 10);
}

/**
 * 浅拷贝
 */
export function clone(src: object) {
	return JSON.parse(JSON.stringify(src));
}

/**
 * 深拷贝
 * @param src  传入对象，对对象进行深克隆
 * @returns 返回深克隆后的对象（数据相同指针不同）
 */
export function deepClone(src: object) {
	if (typeof src === 'object' && src) {
		let target = Array.isArray(src) ? [] : {};
		for (const key in src) {
			(target as any)[key] = deepClone((src as any)[key]);
		}
		return target;
	} else {
		return src;
	}
}

/**
 * 加法（避免精度问题）
 * @param num1
 * @param num2
 * @returns
 */
export function addNum(num1: number, num2: number) {
	const [sq1, sq2] = [num1.toString().split('.')[1] ? num1.toString().split('.')[1].length : 0, num2.toString().split('.')[1] ? num1.toString().split('.')[1].length : 0];
	const m = Math.pow(10, Math.max(sq1, sq2));
	return (num1 * m + num2 * m) / m;
}

/**
 * 根据传入的keyArray数组中的字段对数组array进行分组
 * @param array 分组前的数组
 * @param keyArray 根据什么字段进行分组（此入参为数组，可有多个字段）
 * @param resKey 分组对象值
 * @returns
 */
export function dataGroupingToArray(array: Array<{ [key: string]: any }>, keyArray: Array<string>, resKey = 'list') {
	if (keyArray.length <= 0) return array;
	var aMap = [] as string[];
	var aResult = [] as object[];
	for (var i = 0; i < array.length; i++) {
		var item = array[i];
		var repetitionValue = '';
		var repetitionKey = '';
		keyArray.forEach((keyValue) => {
			repetitionKey = repetitionKey + keyValue;
			repetitionValue += '' + item[keyValue];
		});
		if (aMap.indexOf(repetitionValue) === -1) {
			//没有重复
			var oItem = {};
			oItem[resKey] = [item];
			oItem[repetitionKey] = repetitionValue; //item[key] //分组的字段
			aResult.push(oItem);
			aMap.push(repetitionValue);
		} else {
			//重复了
			var index = aMap.indexOf(repetitionValue);
			aResult[index][resKey].push(item);
		}
	}
	return aResult;
}

/**
 * 检查对象是否存在为空的项
 * @param obj
 * @param checkList 检查的键值对，存在此入参不考虑不检查的键值对
 * @param noCheckList 不检查的键值对
 * @returns
 */
export function checkObjectValues(obj: { [key: string]: any }, checkList: string[] = [], noCheckList: string[] = []): boolean {
	// 遍历对象的键
	for (let key in obj) {
		// 检查键是否有值
		if (checkList.length > 0 && !isNull(checkList)) {
			if (checkList.indexOf(key) > -1 && (obj[key] === undefined || obj[key] === null || obj[key] === '')) {
				return false;
			}
		} else {
			if (noCheckList.indexOf(key) == -1 && (obj[key] === undefined || obj[key] === null || obj[key] === '')) {
				return false;
			}
		}
	}
	return true;
}
/**
 * 根据主题颜色获取亮度调整后的颜色
 * @param delta 亮度变化数值，正数为变亮，负数为变暗
 * @returns 
 */
export function getThemeAdjustColor(delta: number) {
	// 获取主题配置，获取到primary颜色
	const storesThemeConfig = useThemeConfig();
	const { themeConfig } = storeToRefs(storesThemeConfig);
	const primaryColor = themeConfig.value.primary;
	// 根据primary颜色, 计算出lightness值, 然后加上delta, 最后返回hex颜色值
	return color(primaryColor).lightness(color(primaryColor).lightness() + delta).hex();
}